﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

//15的2进制：1111
//15的8进制：17
//15的10进制：15
//15的16进制：F
//16进制的数值之前写：0x
//8进制的数值之前写:0
// 
// 
// 
//操作符详解

//移位操作符
// <<左移操作符
//int main()
//{
//	int a = 10;
//	int b = a << 1;
//	//00000000 00000000 000000000 00001010  a的补码
//	//00000000 00000000 000000000 00010100  b的补码(即为20)
//	printf("b = %d\n", b);
//	printf("a = %d\n", a);
//	return 0;
//}



// >>右移操作符
//int main()
//{
//	int a = -10;
//	int b = a >> 1;
//	//10000000 00000000 00000000 00001010 a的原码
//	//11111111 11111111 11111111 11110101 a的反码
//	//11111111 11111111 11111111 11110110 a的补码
//
//	//11111111 11111111 11111111 11111011 b的补码
//	//10000000 00000000 00000000 00000100 b的反码
//	//10000000 00000000 00000000 00000101 b的原码(即为-5)
//	printf("%d\n", b);
//	return 0;
//}



//位操作符

// & --> 按位与 --> 规则：同时为1，结果才为1，否则为0
//int main()
//{
//	int a = -5;
//	int b = 13;
//	int c = a & b;
//	//10000000 00000000 00000000 00000101  a的原码
//	//11111111 11111111 11111111 11111010  a的反码
//	//11111111 11111111 11111111 11111011  a的补码
//	//00000000 00000000 00000000 00001101  b的补码
//	//根据规则得出
//	//00000000 00000000 00000000 00001001  9
//	printf("%d\n", c);
//	return 0;
//}



// | --> 按位或 --> 规则：同时为0，结果才为0，否则为1
//int main()
//{
//	int a = -5;
//	int b = 13;
//	int c = a | b;
//	//11111111 11111111 11111111 11111011  a的补码
//	//00000000 00000000 00000000 00001101  b的补码
//	//根据规则得出
//	//11111111 11111111 11111111 11111111  补码
//	//10000000 00000000 00000000 00000000  反码
//	//10000000 00000000 00000000 00000001  原码(即为-1)
//	printf("%d\n", c);
//	return 0;
//}



//^ --> 按位异或 --> 规则：相同为0，相异为1
//int main()
//{
//	int a = -5;
//	int b = 13;
//	int c = a ^ b;
//	//11111111 11111111 11111111 11111011  a的补码
//	//00000000 00000000 00000000 00001101  b的补码
//	//根据规则得出
//	//11111111 11111111 11111111 11110110  补码
//	//10000000 00000000 00000000 00001001  反码
//	//10000000 00000000 00000000 00001010  补码(即为-10)
//	printf("%d\n", c);
//	return 0;
//}




// ~ --> 按位取反 --> 规则：对其进行按位取反
//int main()
//{
//	int a = -5;
//	int b = ~a;
//	//11111111 11111111 11111111 11111011  a的补码
//	//00000000 00000000 00000000 00000100  按位取反(补码)(即为4)
//	printf("%d\n", b);
//	return 0;
//}


//可以发现是对其二进制数字进行


//这些操作符作用的举例

//要求按照只有a和b两个变量进行数字交换

//第一种引入第三个变值进行交换（不符合题目）
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int c = 0;
//	printf("交换前:a=%d , b=%d\n", a, b);
//	c = a;
//	a = b;
//	b = c;
//	printf("交换后:a=%d , b=%d\n", a, b);
//	return 0;
//}


//第二种利用加减法
//int main()
//{
//	int a = 10;
//	int b = 20;
//	a = a + b;//a=30
//	b = a - b;//b=10
//	a = a - b;//a=20
//	printf("%d %d", a, b);
//	return 0;
//}


//第三种利用操作符
//假设a=5
//a^a值如何？
//00000000 00000000 00000000 00000101  a的补码
//00000000 00000000 00000000 00000101
//按位异或得
//00000000 00000000 00000000 00000000
//可以发现异或后的值为0
//a^a=0;

//a^0的值为？
//00000000 00000000 00000000 00000101  a的补码
//00000000 00000000 00000000 00000000  0的补码
//
//00000000 00000000 00000000 00000101  异或后
//a^0=a;

//int main()
//{
//	int a = 10;
//	int b = 20;
//	//00000000 00000000 00000000 00001010  a的补码
//	//00000000 00000000 00000000 00010100  b的补码
//	a = a ^ b;
//	b = a ^ b;//b=10
//	a = a ^ b;
//	printf("%d %d\n", a, b);
//	return 0;
//}


//计算一个数值的二进制的1的个数
//第一种(对负数具有缺陷)
//int main()
//{
//	int a = 5;
//	//00000000 0000000 00000000 00000101  a的补码
//	int count = 0;
//	while (a)
//	{
//		if (a % 2 == 1)
//		{
//			count++;
//		}
//		a = a / 2;
//	}
//	printf("%d\n", count);
//	return 0;
//}

//第二种：利用移位操作符
//int main()
//{
//	int a = -1;
//	//10000000 0000000 00000000 00000001  a的原码
//	//11111111 1111111 11111111 11111110  a的反码
//	//11111111 1111111 11111111 11111111  a的补码
//	//
//	//00000000 0000000 00000000 00000001  1的补码
//	// 
//	
//	//00000000 0000000 00000000 00000000
//	int count = 0;
//	int i = 0;
//	for (i = 0;i < 32;i++)
//	{
//		if (((a >> 1) & 1) == 1)
//			count++;
//	}
//	printf("%d", count);
//	return 0;
//}


//第三种:利用位操作符
//int n=13;
//n = n & (n - 1)
//1101 -- n
//1100 -- n-1
//1100 -- n
//1011 -- n-1
//1000 -- n
//0111 -- n-1
//0000 -- n
//每次都是删去二进制中最右边的1


//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int count = 0;
//	while (n)
//	{
//		n = n & (n - 1);
//		count++;
//	}
//	printf("%d\n", n);
//	return 0;
//}



//判断一个数是否是二的次方
//假设n=8
//00000000 00000000 00000000 00001000
//00000000 00000000 00000000 00000111
//按位与得
//00000000 00000000 00000000 00000000

//int main()
//{
//	int n = 8;
//	if ((n & (n - 1)) == 0)
//		printf("Yes\n");
//	else
//		printf("No\n");
//	return 0;
//}

//编写代码将13⼆进制序列的第5位修改为1，然后再改回0

//int main()
//{
//	int a = 13;
//	//00000000 00000000 00000000 00001101  补码
//	//00000000 00000000 00000000 00010000
//	//按位或得
//	//00000000 00000000 00000000 00011101
//	a = (1 << 4) | a;
//	printf("%d\n", a);
//	//再将1换为0
//	//00000000 00000000 00000000 00011101
//	//11111111 11111111 11111111 11101111
//	//00000000 00000000 00000000 00010000
//	a = a & (~(1 << 4));
//	printf("%d\n", a);
//	return 0;
//}

//逗号表达式
//int main()
//{
//	int a = 1;
//	int b = 2;
//	int c = (a > b, a = b + 10, a, b = a + 1);
//	printf("c = %d", c);
//	return 0;
//}

//下标访问[]、函数调⽤()

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6 };
//	//3+5
//	//
//	printf("%d\n", arr[5]);//[] -- 操作符 -- 下标引用操作符
//	//arr,5是[]的两个操作数
//
//	return 0;
//}


//int Add(int x, int y)
//{
//	return x + y;
//}
//
//void test()
//{
//
//}
//
//int main()
//{
//	printf("hehe\n");//()函数调用操作符
//	//()的操作数是printf,"hehe"
//	int r = Add(2, 3);//()函数调用操作符
//	//()的操作数是Add，2，3
//	test();
//	//()的操作数是test
//	return 0;
//}


//结构体

struct B 
{
	char c;
	int m;
};

struct Stu
{
	char name[20];
	int age;
	struct B bb;
	float score;
};

int main()
{
	struct Stu s1 = { "张三李四",20, {'m',5},91.7f };
	struct Stu s2 = { .age = 20,.name = "张三加李四",.score = 91.7f,.bb = {'m',5} };
	printf("%s\n", s1.name);
	printf("%s\n", s2.name);
	return 0;
}


